ELF加壳原理与实现
The following article is from 安全狗的自我修养 Author haidragon
介绍
这篇文章主要是讲在ELF文件中加壳原理以及实现一个简单的壳达到抛砖引玉的效果。
环境:
ubuntu 64bit
前面有讲到了ELF注入shellcode,其中涉及到有对ELF添加节表。然而ELF加壳也需要用到这些技术。
这里只对ELF文件的代码段进行异或加密,原理是读目标ELF文件对代码段进行异或加密,获取text段代码如下:
Elf64_Shdr *getTextSection(Elf64_Ehdr *header) {
size_t i;
Elf64_Shdr *section;
char *strTable;
i = 0;
section = ((void *)header) + header->e_shoff;
strTable = (void *)header + ((section + header->e_shstrndx)->sh_offset);
while (i < header->e_shnum) {
if (strcmp(strTable + section->sh_name, ".text") == 0)
return (section);
section += 1;
i += 1;
}
return (NULL);
}
加密代码如下:
int encryptText(t_header *header) {
Elf64_Xword i;
char *tmp;
Elf64_Shdr *text;
if ((text = getTextSection(header->header)) == NULL)
return (-1);
i = 0;
while (i < text->sh_size) {
tmp = ((void *)header->header) + text->sh_offset + i;
*tmp ^= 0xa5;
i += 1;
}
return (0);
}
然后我们需要写一段shellcode用作解密,代码如下:
...
mov rax, r12
mov rax, [rax]
mov rdx, r12
sub rdx, rax
mov rdi, 0
mov rsi, r12
add rsi, dataend + 12
loop:
cmp rdi, [rsi]
je endLoop
xor byte [rdx], 0xa5
add rdx, 1
add rdi, 1
jmp loop
endLoop:
ret
...
最后我们注入shellcode到ELF文件中,同时修改入口从shellcode开始执行。效果如下:
系统视频教程可以联系作者。
# ELF视频教程
## ELF
* --- 1. 课程介绍.mp4
* --- 2. ELF 介绍.mp4
* --- 3. ELF 打印文件头信息.mp4
* --- 4. ELF 打印节表头信息.mp4
* --- 5. ELF 打印程序头信息.mp4
* --- 6. ELF 打印动态节信息(dynamic dynstr).mp4
* --- 7. ELF 打印重定位表(rel).mp4
* --- 8. ELF 打印重定位表(rela).mp4
* --- 9. ELF 打印符号表(symtab).mp4
* --- 10. ELF 枚举函数.mp4
* --- 11. 获取内存中ELF模块.mp4
* --- 12. 内存中ELF与实体文件区别(装载).mp4
* --- 13. 打印内存中ELF头信息.mp4
* --- 14. 打印ELF中指定的代码段.mp4
* --- 15. shellcode编写.mp4
* --- 16. ELF添加节实现.mp4
* --- 17. 劫持执行文件入口.mp4
* --- 18. ELF静态注入shellcode.mp4
* --- 19. ELF静态注入模块.mp4
* --- 20. ELF动态注入模块.mp4
* --- 21. hook原理.mp4
* --- 22. ELF的got hook.mp4
* --- 23. ELF的plt hook.mp4
* --- 24. ELF加壳原理.mp4
* --- 25. 实现一个简单ELF加密壳.mp4
* --- 26. ELF加载器实现原理.mp4
* --- 27. ELF加载器实现.mp4
* --- 28. linux驱动开发基础.mp4
* --- 29. linux内核中实现so注入.mp4
* --- 30. 总结与ollvm介绍.mp4